package cn.iocoder.yudao.module.system.dal.redis.roleaccess;

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.iocoder.yudao.framework.common.biz.system.roleaccess.dto.RoleAccessDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.roleaccess.RoleAccessDO;
import cn.iocoder.yudao.module.system.service.roleaccess.RoleAccessService;
import com.alibaba.fastjson.JSONArray;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;


import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.concurrent.TimeUnit;

import static cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants.USER_APIJSON_ACCESS;

/**
 * {@link RoleAccessDO} 的 RedisDAO
 *
 * @author fqa
 */
@Repository
public class RoleAccessRedisDAO {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RoleAccessService roleAccessService;

    public List<RoleAccessDTO> getList(Long userId) {
        String redisKey = formatKey(userId);
        return JSONArray.parseArray(stringRedisTemplate.opsForValue().get(redisKey), RoleAccessDTO.class);
    }

    public void set(Long userId, List<RoleAccessDO> roleAccessDOList, LocalDateTime expiresTime) {
        String redisKey = formatKey(userId);
        long time = LocalDateTimeUtil.between(LocalDateTime.now(), expiresTime, ChronoUnit.SECONDS);
        if (time > 0) {
            stringRedisTemplate.opsForValue().set(redisKey, JSONArray.toJSONString(roleAccessDOList), time, TimeUnit.SECONDS);
        }
    }

    public void set(Long userId, LocalDateTime time) {
        set(userId, roleAccessService.getRoleAccessListByUserId(userId), time);
    }

    public void delete(Long userId) {
        String redisKey = formatKey(userId);
        stringRedisTemplate.delete(redisKey);
    }

    private static String formatKey(Long userId) {
        return String.format(USER_APIJSON_ACCESS, userId);
    }
}
